package fr.adfm.webservice.change.implementation;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import net.webservicex.Currency;
import net.webservicex.CurrencyConvertor;
import net.webservicex.CurrencyConvertorSoap;
import fr.adfm.webservice.change.ConversionDevisesBeanRemote;

/**
 * Session Bean implementation class ConversionDevisesBean
 */
@Path("/exchange")
@Stateless
public class ConversionDevisesBean implements ConversionDevisesBeanRemote {

	private static CurrencyConvertor convertisseur = null;

	private static CurrencyConvertorSoap convertisseurSoap = null;
	static {
		init();
	}

	private final static List<String> devises = new ArrayList<String>();
	static {
		devises.add(Currency.JPY.name());
		devises.add(Currency.GBP.name());
		// devises.add(Currency.AUD.name());
		// devises.add(Currency.CAD.name());
		devises.add(Currency.USD.name());
		// devises.add(Currency.HKD.name());
	};

	/**
	 * Default constructor.
	 */
	public ConversionDevisesBean() {
	}

	/**
	 * renvoie le taux de change de deviseCible en fonction de l'euro
	 *
	 * @param montantEuro
	 *            en deviseSource a convertir en deviseCible
	 * @param deviseCible
	 *            devise dont on souhaite connaitre le cours en fonction de
	 *            l'euro
	 * @return deviseCible exprimee en 1 unite EUR
	 *
	 * @see fr.adfm.webservice.change.IConversionDevises#convertirEuro(double,
	 *      net.webservicex.Currency)
	 */
	@Override
	@Path("/{deviseCible}/{montantEuro}")
	@GET
	public String convertirEuro(@PathParam("montantEuro") double montantEuro,
			@PathParam("deviseCible") String deviseCible)
			throws javax.xml.ws.WebServiceException,
			java.net.SocketTimeoutException {

		return String.valueOf(montantEuro
				* convertisseurSoap.conversionRate(Currency.EUR,
						Currency.valueOf(deviseCible)));
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * fr.adfm.webservice.change.ConversionDevisesBeanRemote#tauxEuro(java.lang
	 * .String)
	 */
	@Override
	@Path("/rate/{deviseCible}")
	@GET
	public String tauxEuro(@PathParam("deviseCible") String deviseCible)
			throws javax.xml.ws.WebServiceException,
			java.net.SocketTimeoutException {

		return String.valueOf(convertisseurSoap.conversionRate(Currency.EUR,
				Currency.valueOf(deviseCible)));
	}

	/**
	 * initialise l'acces au service soap
	 */
	private static void init() {

		if (convertisseur == null) {
			convertisseur = new CurrencyConvertor();
		}
		if (convertisseurSoap == null) {
			convertisseurSoap = convertisseur.getCurrencyConvertorSoap();
		}
	}

	@Override
	@Path("/currencies")
	@GET
	// @Produces(MediaType.APPLICATION_JSON)
	public String getDevisesDisponibles() {

		return devises.toString();
	}

}
